package cn.tedu.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;

import java.util.ArrayList;
import java.util.List;

/**
 * 在properties文件中，需要按照对应关系去指定配置key值
 * key = prefix.属性名称
 */
@Configuration
@ConfigurationProperties(prefix = "easymall.redis")// 当前配置类主要配置redis
@Data
public class ShardedJedisConfig {
//    String redisServerIp = "10.42.182.184";

    /**
     * properties文件中 redis.maxTotal
     */
    Integer maxTotal;
    /**
     * // properties文件中 redis.maxIdle
     */
    Integer maxIdle;
    Integer minIdle;
    /**
     * ConfigurationProperties支持 属性值以,隔开赋值list类型的数据
     * 有多少个节点就以10.42.182.184:6379,10.42.182.184:6380,10.42.182.184:6381
     */
    List<String> nodes;

    @Bean
    public ShardedJedisPool initPool() {
//        // 收集节点信息
//        List<JedisShardInfo> info = new ArrayList<>();
//        info.add(new JedisShardInfo(redisServerIp, 6379));
//        info.add(new JedisShardInfo(redisServerIp, 6380));
//        info.add(new JedisShardInfo(redisServerIp, 6381));
//        // 配置属性config
//        JedisPoolConfig config = new JedisPoolConfig();
//        config.setMaxTotal(200);
//        config.setMaxIdle(8);
//        config.setMinIdle(3);
//        return new ShardedJedisPool(config, info);

        // 收集节点信息
        List<JedisShardInfo> info = new ArrayList<>();
        // 从nodes数据中解析出来每一个节点ip地址和端口号
        // nodes={"10.42.182.184:6379", "10.42.182.184:6380", "10.42.182.184:6381"}
        for (String node : nodes) {
            // 对list的所有元素进行循环，每次循环拿出一个元素值，赋值给node
            // node循环第一次 node = 10.42.182.184:6379
            String[] strs = node.split(":");
            String host = strs[0];
            int port = Integer.parseInt(strs[1]);
            info.add(new JedisShardInfo(host, port));
        }
        // 配置属性config
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        return new ShardedJedisPool(config, info);
    }
}
